#include <conio.h>
#include <graphics.h>

#define High 480  // 游戏画面尺寸
#define Width 640

// 全局变量
int ball_x,ball_y; // 小球的坐标
int ball_vx,ball_vy; // 小球的速度
int radius;  // 小球的半径
int bar_left,bar_right,bar_top,bar_down;//挡板各点坐标
int brickLeft[10],brickblack[10]={-50};
int bar_x,bar_y;//挡板中点坐标

void startup()  // 数据初始化
{
	ball_x = Width/2;
	ball_y = High/2;
	ball_vx = 1;
	ball_vy = 1;
	radius = 20;
	bar_left=Width/5;
	bar_right=Width/5+200;
	bar_down=High-20;
	bar_top=High-40;
	
	int i;
	for(i=0;i<10;i++)
	{
		brickLeft[i]=i*64;
	}

	initgraph(Width, High);
	BeginBatchDraw();
}

void clean()  // 显示画面
{
	// 绘制黑线、黑色填充的圆
	setcolor(BLACK);
	setfillcolor(BLACK);
	fillcircle(ball_x, ball_y, radius);
	//绘制黑色挡板
	setcolor(BLACK);
	setfillcolor(BLACK);
	fillrectangle(bar_left,bar_top,bar_left+10,bar_down);
	fillrectangle(bar_right-10,bar_top,bar_right,bar_down);
	fillrectangle(bar_left,bar_top-10,bar_right,bar_top);
	fillrectangle(bar_left,bar_down,bar_right,bar_down+10);
}	

void show()  // 显示画面
{
	int i;

	// 绘制黄线、绿色填充的圆
	setcolor(YELLOW);
	setfillcolor(GREEN);
	fillcircle(ball_x, ball_y, radius);	
	FlushBatchDraw();
	//绘制挡板
	setcolor(WHITE);
	setfillcolor(YELLOW);
	fillrectangle(bar_left,bar_top,bar_right,bar_down);	
	
	for(i=0;i<10;i++)
	{
		if(brickLeft[i]!=brickblack[i])
			{
				//绘制砖块
				setcolor(WHITE);
				setfillcolor(RED);
				fillrectangle(brickLeft[i],0,brickLeft[i]+64,40);
			}
	}
	
	// 延时
	Sleep(2);	
}	

void updateWithoutInput()  // 与用户输入无关的更新
{
	int i=0;

	// 更新小圆坐标
	ball_x = ball_x + ball_vx;
	ball_y = ball_y + ball_vy;
	//球碰墙
	if ((ball_x<=radius)||(ball_x>=Width-radius))
		ball_vx = -ball_vx;
	if ((ball_y<=radius)||(ball_y>=High-radius))
		ball_vy = -ball_vy;	
	//球碰板
	if((ball_y>=bar_top) && (ball_y<=bar_down) && (ball_x+radius>=bar_left) && (ball_x-radius<=bar_right))
		ball_vx=-ball_vx;
	if((ball_x>=bar_left) && (ball_x<=bar_right) && (ball_y+radius>=bar_top) && (ball_y-radius<=bar_down))
		ball_vy=-ball_vy;

	//球碰砖块
	if(ball_y-radius<=40)//若碰到砖块
	{
		for(i=0;i<10;i++)
		{
			if((brickLeft[i]<=ball_x) && (brickLeft[i]+64>=ball_x))//判断在哪个砖块范围内
			{
				/*绘制黑色砖块
				setcolor(BLACK);
				setfillcolor(BLACK);
				fillrectangle(brickLeft[i],0,brickLeft[i]+64,40);*/
				if(brickLeft[i]!=brickblack[i])//如果不是黑色砖块
				{
					ball_y=-ball_y;
					brickblack[i]=brickLeft[i];
				}
			}
		}
	}
}

	
void updateWithInput()  // 与用户输入有关的更新
{	
	if(MouseHit())//检测是否有鼠标消息
	{
		MOUSEMSG m;//定义鼠标消息

		if(m.uMsg==WM_MOUSEMOVE)
		{
			//挡板的位置等于鼠标的位置
			bar_x=m.x;
			bar_y=m.y;
			bar_left=bar_x-100;
			bar_right=bar_x+100;
			bar_top=bar_y-10;
			bar_down=bar_y+10;
		}

	}
}

void gameover()
{
	EndBatchDraw();
	closegraph();
}

int main()
{
	startup();  // 数据初始化	
	while (1)  //  游戏循环执行
	{
		clean();  // 把之前绘制的内容清除
		updateWithoutInput();  // 与用户输入无关的更新
		updateWithInput();     // 与用户输入有关的更新
		show();  // 显示新画面
	}
	gameover();     // 游戏结束、后续处理
	return 0;
}